//+----------------------------------------------------------+ //| 4/8/2007 preBar.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+----------------------------------------------------------+ int MAGICMA=20070705; extern double Lots = 0.1; extern double MaximumRisk = 0.03; extern double stopFactor = 1; extern double TakeProfit1 = 150; extern double Stoploss1 = 140; extern bool takeProfit = true; extern bool sartrail = false; extern bool MoneyManagement = false; //+----------------------------------------------------------+ //| Calculate open positions | //+----------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i0) return(buys); else return(-sells); } double LotsOptimized() { //---- select lot size int lot; lot = NormalizeDouble( (AccountFreeMargin()*MaximumRisk)/( iATR(NULL,0,20,0)*(1/Point) )*0.1,1); //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+----------------------------------------------------------+ //| Check for open order conditions | //+----------------------------------------------------------+ void CheckForOpen() { if(!NewBar()) return; int res; if(MoneyManagement) Lots = LotsOptimized(); double close1 = Close[1]; double open1 = Open[1]; if ( close1< open1 ) { openSell(); return; } //---- buy conditions if ( close1> open1 ) { openBuy(); return; } //---- } void openBuy(){ Stoploss1 = stopFactor * iATR(NULL,0,20,0)+ MarketInfo (Symbol(), MODE_SPREAD) * Point; int res; if(takeProfit) res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stoploss1,Ask+TakeProfit1*Point ,"preBar",MAGICMA,0,Blue); else res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stoploss1,0,"preBar",MAGICMA,0, Blue); if(res>0) { if(OrderSelect(res,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); Comment("preBar opened buy order " + Ask); } else Print("Error opening SELL order : ",GetLastError()); } void openSell(){ Stoploss1 = stopFactor * iATR(NULL,0,20,0)+ MarketInfo (Symbol(), MODE_SPREAD) * Point; int res; if(takeProfit) res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+Stoploss1,Bid-TakeProfit1*Point,"preBar",MAGICMA,0,Red); else res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+Stoploss1,0,"preBar",MAGICMA,0 ,Red); if(res>0) { if(OrderSelect(res,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); Comment("preBar opened sell order " + Bid); } else Print("Error opening SELL order : ",GetLastError()); } //+----------------------------------------------------------+ //| Check for close order conditions | //+----------------------------------------------------------+ void CheckForClose() { //---- for(int i=0;i Close[1]) { OrderClose(OrderTicket(),OrderLots(),Bid,3,White); openSell(); } // should it be closed? // Function version check Sell condition to exit Buy // check for trailing stop if ( sartrail && (iSAR(NULL,0,0.02,0.2,1) > OrderStopLoss()) && (Bid > iSAR(NULL,0,0.02,0.2,1)) && (OrderOpenPrice() < iSAR(NULL,0,0.02,0.2,1)) && (iSAR(NULL,0,0.02,0.2,1) > iSAR(NULL,0,0.02,0.2,2))) { OrderModify(OrderTicket(),OrderOpenPrice(),iSAR(NULL,0,0.02,0.2,1),OrderTakeProfit(),0,Blue); Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds()); return(0); } } if(OrderType()==OP_SELL) { if(!takeProfit && NewBar() && Open[1]< Close[1]) { OrderClose(OrderTicket(),OrderLots(),Ask,3,White); openBuy(); } // should it be closed? // Function version check Buy condition to exit Sell if (sartrail && (iSAR(NULL,0,0.02,0.2,1) < OrderStopLoss()) && (Ask < iSAR(NULL,0,0.02,0.2,1)) && (OrderOpenPrice() > iSAR(NULL,0,0.02,0.2,1)) && (iSAR(NULL,0,0.02,0.2,1) < iSAR(NULL,0,0.02,0.2,2))) { OrderModify(OrderTicket(),OrderOpenPrice(),iSAR(NULL,0,0.02,0.2,1),OrderTakeProfit(),0,Blue); Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds()); return(0); } } } } return(0); } // the end. //---- //+----------------------------------------------------------+ //| Start function | //+----------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+---------------------------------------------------------- bool NewBar() { static datetime lastbar; datetime curbar = Time[0]; if(lastbar!=curbar){ lastbar=curbar; return (true); } else { return(false); } }